package al.xc.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.*;

import java.util.List;
import java.util.Map;

/**
 * redis
 */
public interface IRedisConnect {

    /**
     * 初始化
     * @param config
     * @param host
     * @param port
     * @param timeout
     * @param password
     * @param index
     */
    void initialize(GenericObjectPoolConfig config, String[] host, int[] port, int timeout, String password, int index);

    /**
     * 获取数据
     * @param key
     * @param fields
     * @return
     */
    List<String> hmget(String key, String... fields);

    /**
     * 获取数据
     * @param key
     * @param field
     * @return
     */
    String hget(String key, String field);

    /**
     * 获取所有数据
     * @param key
     * @return
     */
    Map<String, String> hgetAll(String key);

    /**
     * 设置数据
     * @param key
     * @param field
     * @param vl
     * @return
     */
    Long hset(String key, String field, String vl);

    /**
     * 删除数据
     * @param key
     * @param field
     * @return
     */
    Long hdel(String key, String... field);

    /**
     * 订阅频道
     * @param pubSub
     * @param channel
     */
    void subscribe(JedisPubSub pubSub, String... channel);

    /**
     * 订阅模式
     * @param pubSub
     * @param partten
     */
    void psubscribe(JedisPubSub pubSub, String... partten);

    /**
     * 发布
     * @param channel
     * @param value
     */
    void publish(String channel, String value);

    /**
     * 执行脚本
     * @param script
     * @param keys
     * @param args
     * @return
     */
    Object eval(final String script, final List<String> keys, final List<String> args);

    /**
     * 定位数据添加
     * @param key
     * @param longitude
     * @param latitude
     * @param member
     * @return
     */
    Long geoadd(String key, double longitude, double latitude, String member);

    /**
     * 删除集合元素
     * @param key
     * @param member
     * @return
     */
    Long zrem(String key, String... member);

    /**
     * 获取范围内的元素
     * @param key
     * @param longitude
     * @param latitude
     * @param radius
     * @param unit
     * @return
     */
    List<GeoRadiusResponse> georadius(String key, double longitude, double latitude, double radius, GeoUnit unit);
}
